import Idb from 'idb-js';
import { csbasecommonAll } from '@/axios/api';
import { dateToString } from '@/utils/util';

/**
 * 构建idb数据库
 */
class idb {
    constructor() {
        this.db = {}
    }
    init(name, options) {
        let self = this
        return new Promise((resolve, reject) => {
            Idb({
                dbName: "csbase_params_all",                // *数据库名称
                version: 1,                                 // 数据库版本号（默认为当前时间戳）
                tables: [                                   // *数据库的表，即ObjectStore
                {
                    tableName: name,                 // *表名
                    option: { keyPath: "id" },          // 表配置，即ObjectStore配置，此处指明主键为id
                    indexs: [                           // 数据库索引（建议加上索引）
                        {
                            key: "id",                  // *索引名
                            option:{                    // 索引配置，此处表示该字段不允许重复
                                unique: true
                            }
                        }
                    ]
                }
                ]
            }).then(db => {
                self.db = db
                self.get('baoguange', 'createTime').then(res => {
                    let falg = false
                    if (res !== null) {
                        // 先查询是否存在数据库 或者数据库时间过期重新加载数据
                        let time = new Date().getTime() - new Date(res.data).getTime()
                        let days = Math.floor(time/(24*3600*1000))
                        // 小于一天直接返回
                        if (days < 1) {
                            self.db.queryAll({
                                tableName: name,
                                success:(res)=>{
                                    resolve(res);
                                },
                            })
                            falg = true
                        } else {
                            // 过期清空数据
                            self.db.clear_table({
                                tableName: name
                            })
                        }
                    }
                    // 不存在数据库 或者时间过期重新设置
                    if(!falg) {
                        csbasecommonAll(options).then(res => {
                            if (res.code === 0) {
                                let data = []
                                for (let key in res.data) {
                                    let item = {
                                        id: key,
                                        data: res.data[key]
                                    }
                                    data.push(item)
                                }
                                // 添加时间戳
                                data.push({
                                    id: 'createTime',
                                    data: dateToString(new Date(), "yyyy-mm-dd HH-mm-ss")
                                })
                                self.db.insert({
                                    tableName: name,
                                    data: data,
                                    success: () => {
                                        resolve(data);
                                    }
                                });
                            }
                        })
                    }
                })
            })
        })
    }
    /**
     * @memberof 设置单表数据
     * @param {表名} name 
     * @param {数据} data 
     * @returns 
     */
    set(name, data) {
        let self = this
        return new Promise((resolve, reject) => {
            self.db.insert({
                tableName: name,
                data: data,
                success:(res)=>{
                    resolve(res.data);
                },
                error: (error) => {
                    reject(error)
                }
            });
        })
    }
    /**
     * @memberof 设置单表数据
     * @param {表名} name 
     * @param {索引} key 
     * @returns 
     */
    get(name, key) {
        let self = this
        return new Promise((resolve, reject) => {
            self.db.query_by_primaryKey({
                tableName: name,
                target:key,
                success:(res)=>{
                    resolve(res);
                },
                error: (error) => {
                    reject(error)
                }
            })
        })
    }
    /**
     * @memberof 设置单表所有数据
     * @param {表名} name 
     * @returns 
     */
    getAll(name) {
        let self = this
        return new Promise((resolve, reject) => {
            self.db.queryAll({
                tableName: name,
                success:(res)=>{
                    resolve(res);
                },
                error: (error) => {
                    reject(error)
                }
            })
        })
    }
}

export default new idb()